package dao;

import dto.LogDTO;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.LocalDate;
import java.util.ArrayList;

/**
 *
 * @author lucifer
 */
public class LogDAO {

  private static LogDAO dao = null;
  private final Connection c;

  public static LogDAO createDAO() throws SQLException  {
    if (dao == null) {
      dao = new LogDAO();
    }
    return dao;
  }

  private LogDAO() throws SQLException {
    c = DB.PQ().Conn();
  }


  public ArrayList<LogDTO> All() throws SQLException {
    return getLogDTOs("select t.id, t.fecha, m.nombre, m.apellido, p.nombre, p.apellido, t.estado, t.fecha_asignacion, u.username from turno t, medico m, paciente p, senzu_user u where t.id_medico = m.id and t.id_paciente = p.id and t.id_user_asignacion = u.id and t.estado != 'Libre' order by t.fecha desc;"); 
  }

  public ArrayList<LogDTO> Search(LocalDate desde, LocalDate hasta, int idMedico, int idPaciente) throws SQLException {
    String query = String.format(
      "select t.id, t.fecha, m.nombre, m.apellido, p.nombre, p.apellido, t.estado, t.fecha_asignacion, u.username from turno t, medico m, paciente p, senzu_user u where t.id_medico = m.id and t.id_paciente = p.id and t.id_user_asignacion = u.id and t.estado != 'Libre' %s %s %s %s order by t.fecha desc;",
      desde != null ? "and '" + desde + "' <= t.fecha " : "",
      hasta != null ? "and t.fecha <= '" + hasta.plusDays(1) + "'" : "",
      idMedico != -1 ? "and m.id = " + idMedico : "",
      idPaciente != -1 ? "and p.id = " + idPaciente : ""
    ); 
    return getLogDTOs(query);
  }

  private ArrayList<LogDTO> getLogDTOs(String query) throws SQLException {
    Statement s = c.createStatement();
    ResultSet r = s.executeQuery(query);
    ArrayList<LogDTO> logs = new ArrayList<>();
    while (r.next()) {
      logs.add(
        new LogDTO(
          r.getInt(1),
          r.getString(2),
          String.format("%s %s", r.getString(3), r.getString(4)),
          String.format("%s %s", r.getString(5), r.getString(6)),
          r.getString(7),
          r.getString(8),
          r.getString(9)
        )
      );
    }
    r.close();
    s.close();
    return logs;
  }

}
